package transformaciones;

import java.nio.DoubleBuffer;

import javax.media.opengl.GL;

/**
 * Clase que representa la matriz de transformaciones de un objeto 3d
 * @author Chema
 *
 */
public class TAfin {

	private DoubleBuffer matriz;
	private GL gl;
	
	public TAfin(GL gl){
	    matriz = DoubleBuffer.allocate(16);
	    matriz.array()[0] = 1; 
	    matriz.array()[4] = 0;
	    matriz.array()[8]  = 0; 
	    matriz.array()[12] = 0;
	    matriz.array()[1] = 0; 
	    matriz.array()[5] = 1; 
	    matriz.array()[9]  = 0; 
	    matriz.array()[13] = 0;
	    matriz.array()[2] = 0; 
	    matriz.array()[6] = 0;
	    matriz.array()[10] = 1; 
	    matriz.array()[14] = 0;
	    matriz.array()[3] = 0; 
	    matriz.array()[7] = 0; 
	    matriz.array()[11] = 0;
	    matriz.array()[15] = 1;
	    this.gl=gl;
	}
	
	public TAfin(double m[],GL gl){
	    matriz = DoubleBuffer.allocate(16);
	    for(int i=0;i<16;i++){
	    	matriz.array()[i] = m[i];
	    }
	    this.gl=gl;
	}
	
	public void escalar(double sx,double sy,double sz){
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glPushMatrix();
		gl.glLoadIdentity();
		gl.glLoadMatrixd(matriz);
		gl.glScaled(sx, sy, sz);
		gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, matriz);
		gl.glPopMatrix();
	}
	
	public void rotarX(double ang){
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glPushMatrix();
		gl.glLoadIdentity();
		gl.glLoadMatrixd(matriz);
		gl.glRotated(ang,1,0,0);
		gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, matriz);
		gl.glPopMatrix();
	}
	
	public void rotarY(double ang){
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glPushMatrix();
		gl.glLoadIdentity();
		gl.glLoadMatrixd(matriz);
		gl.glRotated(ang,0,1,0);
		gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, matriz);
		gl.glPopMatrix();
	}
	
	public void rotarZ(double ang){
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glPushMatrix();
		gl.glLoadIdentity();
		gl.glLoadMatrixd(matriz);
		gl.glRotated(ang,0,0,1);
		gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, matriz);
		gl.glPopMatrix();
	}
	
	public void trasladar(double tx,double ty,double tz){
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glPushMatrix();
		gl.glLoadIdentity();
		gl.glLoadMatrixd(matriz);
		gl.glTranslated(tx, ty, tz);
		gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, matriz);
		gl.glPopMatrix();
	}

	public DoubleBuffer getMatriz() {
		return matriz;
	}

	public void setMatriz(DoubleBuffer matriz) {
		this.matriz = matriz;
	}
	
	public void setMatriz(double [] m){
		matriz = DoubleBuffer.allocate(16);
		for (int i=0;i<m.length;i++){
			matriz.array()[i]=m[i];
		}
	}
	
}
